 package test.pool.connectionpool;

import java.util.HashMap;
import java.util.Vector;
import java.sql.*;
 

public class ConnectionPool {
	

		//连接池的管理器,首先初始化，仅仅有一个对象，管理连接池
		private static HashMap<String, ConnectionPool> connectionPoolManager=new HashMap<String, ConnectionPool>();
		//没有用过的连接池，用vector实现同步
		private static Vector<Connection> noUseConnectionPool;
		//没有用过的连接池
		private static HashMap<Connection, Connection> nowUseConnectionPool;
		
		private static String dbDriver="com.mysql.jdbc.Driver";
		private static String dbUrl="jdbc:mysql://127.0.0.1/smbcrm";
		private static String userName="root";
		private static String userPassword="123456";

		//默认为100个连接池
		private static int MAX_POOL=100;
		
		//singleTon 设计模式
		private ConnectionPool(String driver,String url,String name,String password,int max)
		throws ClassNotFoundException {
		Class.forName(driver);
		dbUrl=url;
		userName=name;
		userPassword=password;
		MAX_POOL=max;
		}
		public static ConnectionPool getConnManagerInstance(String poolName)
		throws ClassNotFoundException{
		ConnectionPool tempPool=(ConnectionPool)connectionPoolManager.get(poolName);
		if(tempPool==null){
		tempPool=new ConnectionPool(dbDriver,dbUrl,userName,userPassword,MAX_POOL);
		connectionPoolManager.put(poolName,tempPool);
		return tempPool;
		}else
		return tempPool;
		}
		
		//通过连接池获得真正的链接
		public static Connection getConnection() throws java.sql.SQLException{
		Connection conn=null;
		synchronized(noUseConnectionPool){
		if(noUseConnectionPool.size()>0){
		conn=(Connection)noUseConnectionPool.firstElement();
		noUseConnectionPool.remove(conn);
		return conn;
		}
		}
		//如果数据库连接池没有链接了，自己创建一个
		if(conn==null){
		conn=createConnection(dbDriver,dbUrl,userName,userPassword);
		}else if(conn.isClosed()){
		nowUseConnectionPool.remove(conn);
		conn=createConnection(dbDriver,dbUrl,userName,userPassword);
		}
		conn.setAutoCommit(false);
		nowUseConnectionPool.put(conn,conn);
		return conn;
		}
		
		//如果连接池没有链接了，就需要产生一个链接
		private static Connection createConnection(String driver,String url,String user,String password)
		throws java.sql.SQLException{
		Connection conn=DriverManager.getConnection(url,user,password);
		return conn;
		}
		public static void releaseConnection(Connection conn,boolean isCommit)
		throws java.sql.SQLException{
		if(isCommit)
		conn.commit();
		else
		conn.rollback();
		nowUseConnectionPool.remove(conn);
		if(noUseConnectionPool.size() + nowUseConnectionPool.size()<MAX_POOL){
		synchronized(noUseConnectionPool){
		noUseConnectionPool.add(conn);
		}
		}else{
		conn.close();
		}
		}
		
		public static void main(String[] args) {
		//测试模拟10个客户
		for (int i = 0; i < 10; i++) {
		try {
		//xxxx 一般为属性文件读取
		ConnectionPool pool = ConnectionPool.getConnManagerInstance("xxxx");
		Connection conn = ConnectionPool.getConnection();
		
		}catch (SQLException ex1) {
			ex1.printStackTrace();
		}
		catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		}
		}
		}
		} 